home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 19 / CU Amiga Magazine's Super CD-ROM 19 (1998)(EMAP Images)(GB)[!][issue 1998-02].iso / CUCD / Online / NNTPd / server / ahbs.c < prev    next >
Encoding:
C/C++ Source or Header  |  2002-11-01  |  2.7 KB  |  131 lines

  1. #ifndef lint
  2. static char    sccsid[] = "@(#)ahbs.c    1.8    (Berkeley) 1/11/88";
  3. #endif
  4.  
  5. #include "common.h"
  6.  
  7. static char    *verbiage[] = {
  8.     "head and body follow",
  9.     "head follows",
  10.     "body follows",
  11.     "request text separately"
  12. };
  13.  
  14. /*
  15.  * {ARTICLE,HEAD,BODY,STAT} <messageid>|articlenum
  16.  *
  17.  * Retrieve article, head, body, or stat, depending on the
  18.  * command we were invoked with.
  19.  */
  20.  
  21. void
  22. ahbs(argc, argv)
  23.     int        argc;
  24.     char        *argv[];
  25. {
  26.     char        artbuf[MAXPATHLEN], art_id[MAXBUFLEN];
  27.     register char    c;
  28.     int        method;
  29.     register FILE    *fp;        /* For Message-ID retrieval only */
  30.  
  31.     if (argc > 2) {
  32.         printf("%d Usage: %s <message-id>|article_number.\r\n",
  33.             ERR_CMDSYN,argv[0]);
  34.         (void) fflush(stdout);
  35.         return;
  36.     }
  37.  
  38.     if ((c = *argv[0]) == 'a' || c == 'A')
  39.         method = ARTICLE;
  40.     else if ((c == 's' || c == 'S'))
  41.         method = STAT;
  42.     else
  43.         method = ((c == 'h' || c == 'H') ? HEAD : BODY);
  44.  
  45.     if (argc == 2 && *argv[1] == '<') {    /* Message ID */
  46.         fp = openartbyid(argv[1]);
  47.         if (fp == NULL) {
  48.             printf("%d No article by message-id %s, sorry.\r\n",
  49.                 ERR_NOART, argv[1]);
  50.             (void) fflush(stdout);
  51.             return;
  52.         }
  53.         if (check_ngperm(fp) == 0) {
  54.             printf("%d Can't give that to you, sorry.\r\n",
  55.                 ERR_ACCESS);
  56.             (void) fflush(stdout);
  57.             (void) fclose(fp);
  58.             return;
  59.         }
  60.         printf("%d %ld %s Article retrieved, %s.\r\n",
  61.             OK_ARTICLE + method, group_artnum, argv[1],
  62.             verbiage[method]);
  63.         spew(fp, method);
  64.         (void) fclose(fp);
  65. #ifdef LOG
  66.         if (nn_told)
  67.             nn_took++;
  68. #endif
  69.         return;
  70.     }
  71.  
  72.     /* Else we're trying to read */
  73.  
  74.     if (!canread) {
  75.         printf("%d You only have permission to transfer, sorry.\r\n",
  76.             ERR_ACCESS);
  77.         (void) fflush(stdout);
  78.         return;
  79.     }
  80.  
  81.     if (!ingroup) {
  82.         printf("%d You are not currently in a newsgroup.\r\n",
  83.             ERR_NCING);
  84.         (void) fflush(stdout);
  85.         return;
  86.     }
  87.  
  88.     if (argc == 1) {
  89.         if (art_ptr < 0 || art_ptr >= num_arts) {
  90.             printf("%d No article is currently selected.\r\n",
  91.                 ERR_NOCRNT);
  92.             (void) fflush(stdout);
  93.             return;
  94.         }
  95.         (void) sprintf(artbuf, "%d", art_array[art_ptr]);
  96.     } else
  97.         (void) strcpy(artbuf, argv[1]);
  98.  
  99.     if (!valid_art(artbuf)) {
  100.         printf("%d Invalid article number: %s.\r\n",
  101.             ERR_NOARTIG, artbuf);
  102.         (void) fflush(stdout);
  103.         return;
  104.     }
  105.  
  106.     while (open_valid_art(artbuf, art_id) == NULL) {
  107.         if (argc > 1) {
  108.             printf("%d Invalid article number: %s.\r\n",
  109.                 ERR_NOARTIG, artbuf);
  110.             (void) fflush(stdout);
  111.             return;
  112.         } else {
  113.             if (++art_ptr >= num_arts) {
  114.                 printf("%d Invalid article number.\r\n",
  115.                     ERR_NOARTIG);
  116.                 (void) fflush(stdout);
  117.                 return;
  118.             }
  119.             (void) sprintf(artbuf, "%d", art_array[art_ptr]);
  120.         }
  121.     }
  122.  
  123.     printf("%d %s %s Article retrieved; %s.\r\n",
  124.         OK_ARTICLE + method, artbuf, art_id, verbiage[method]);
  125.  
  126.     spew(art_fp, method);
  127.  
  128.     if (argc > 1)
  129.         art_ptr = findart(artbuf);
  130. }
  131.